package DigitalNetwork;

import java.util.*;

/**
 * A digitalis halozat epitoeleme.
 * <p>
 *
 * </p>
 *
 * @author Ableda Peter
 * @author Andrasi Istvan
 * @author Kamaras Karoly
 * @author Pora Szilard
 *
 * @version 1.0 Build 2011.04.17.
 */
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public abstract class Unit {

	/** Az elem bemeneteinek listaja. */
	protected List<PortIn> inputs;
	/** Az elem kimeneteinek listaja. */
	protected List<PortOut> outputs;
	/** Az elem azonositoja. */
	protected String ID;
	/** Az egység grafikus feluleten valo elhelyezesehez szukseges koordinatak*/
	public List<Integer> coordinates;

	/** [Konstruktor]
	 * Letrehozza a koordinatak listajat.
	 *
	 * @param x Az elem poziciojanak vizszintes komponense.
	 * @param y Az elem poziciojanak fuggoleges komponense.
	 */
	//==========================================================================
	public Unit(int x, int y) {
		coordinates = new ArrayList<Integer>();
		this.coordinates.add(x);
		this.coordinates.add(y);
	}
	//==========================================================================

	/**
	 * Visszaadja az elem ID-jet.
	 *
	 * @return String Az elem ID-ja.
	 */
	//==========================================================================
	public String getID() {
		return this.ID;
	}
	//==========================================================================

	/**
	 * Vissza adja az elem tipusat.
	 *
	 * @return String Az elem tipusa.
	 */
	//==========================================================================
	public String getType() {
		return "Unit";
	}
	//==========================================================================

	/**
	 * Vissza adja az elem kategoriajat.
	 *
	 * @return String Az adott kategoria.
	 */
	//==========================================================================
	public String getCategory() {
		return "Unit";
	}
	//==========================================================================

	/**
	 * Az elem ID-jet es allapotat kiiro fuggveny
	 * 
	 * @return
	 */
	//==========================================================================
	public String print() {
		return "";
	}
	//==========================================================================

	/**
	 * Az elem x indexu kimenetet rakoti U elem y indexu bemenetere.
	 *
	 * @param x Kimenet indexe.
	 * @param U A halozat egy eleme.
	 * @param y U elem bemenetenek indexe.
	 */
	//==========================================================================
	public void connectUnit(int x, Unit U, int y) {
			if (outputs.size() > x && U.inputs.size() > y) {
				// Ha leteznek a portok, megprobaljuk bekotni:
				if (this.outputs.get(x).addTarget(U.inputs.get(y))) {
					// Sikerult csatlakoztatni.
					Main.printMessage("#" + this.getID() + " elem " + x
						+ ". kimeneti portja osszekotve #"
						+ U.getID() + " elem " + y + ". bemeneti portjaval");
				}
				// Nem sikerult csatlakoztatni.
			} else {
				Main.printMessage("#[WARNING] #" + this.getID() + " és #"
					+ U.getID() + " csatlakoztatás nem sikerült.");
			}
	}
	//==========================================================================

	/**
	 * Vizsgalja hogy az elem kesz-e a szimulaciora.
	 * <p>
	 * Megvizsgalja, hogy minen bemenete, és kimenete csatlakoztatva van-e az
	 * elemnek.
	 * </p>
	 *
	 * @return Igaz, ha be van kotve, hamis, ha nem.
	 */
	//==========================================================================
	public boolean isReady() {
		boolean result = true;

		if (this.inputs != null) {
			// Minden intput be van kotve?
			ListIterator<PortIn> iI = this.inputs.listIterator();
			while (iI.hasNext()) {
				PortIn P = iI.next();
				// Ha csatlakoztatva van, az eredmenyi igaz marad.
				result = result && P.isConnected();
			}
		}

		if (this.outputs != null) {
			// Minden output be van kotve?
			ListIterator<PortOut> iO = this.outputs.listIterator();
			while (iO.hasNext()) {
				PortOut P = iO.next();
				// Ha csatlakoztatva van, az eredmenyi igaz marad.
				result = result && P.isConnected();
			}
		}

		// Ha minden csatlakoztatva volt, igaz maradt, egyebkent hamis lett.
		return result;
	}
	//==========================================================================

	/**
	 * Kinullazza a frissites szamlalokat.
	 */
	//==========================================================================
	public void resetUpdateCount() {
		if (this.outputs != null) {
			// Minden kimetere:
			ListIterator<PortOut> i = outputs.listIterator();
			while (i.hasNext()) {
				PortOut P = i.next();
				// Lenullazzuk a frissites szamlalot.
				P.resetUpdateCount();
			}
		}
	}
	//==========================================================================

	/**
	 * Frissiti az elem kimenetet.
	 */
	//==========================================================================
	public void updateOutput() {
		// Ures metodus, felul kell definialni.
	}
	//==========================================================================
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

